package com.fpf.lab01_basics;

import java.util.concurrent.atomic.AtomicInteger;

public class Demo8_AtomicInteger {
    public static void main(String[] args) throws InterruptedException {
        // 多线程环境下使用 AtomicInteger 进行原子操作，确保计数器的自增操作是线程安全的。
        AtomicInteger counter = new AtomicInteger(0);
        int n = 2, loop = 500_000;
        // 2个线程，每个线程执行500000次自增操作
        Thread[] ts = new Thread[n];
        for (int i = 0; i < n; i++) {
            ts[i] = new Thread(() -> {
                // 执行500_000次的自增操作
                for (int j = 0; j < loop; j++) counter.incrementAndGet();
            });
            ts[i].start();
        }
        for (Thread t : ts) t.join();
        System.out.println("counter:" + counter.get());
    }
    /*
    AtomicInteger 的工作原理
    AtomicInteger 是 Java 并发包中提供的原子整数类，它使用 CAS（Compare-And-Swap）操作实现原子性：

    1. CAS 操作
    incrementAndGet() 方法内部使用 CAS 操作实现原子自增
    CAS 操作包含三个步骤：
    获取当前值
    计算新值（当前值 + 1）
    如果当前值没有被其他线程修改，则更新为新值；否则重试
    2. 无锁算法
    AtomicInteger 使用无锁算法，避免了传统锁机制带来的线程阻塞和上下文切换开销
    在低竞争情况下，性能优于使用锁的实现x`
     */
}
